iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 24
2

今日目標

今天是最後一天寫扣了,前幾天已經把功能都做完,今天只修一些部署會用到的小地方

部署的 URL

之前在 Day10-替換頁面中的網址 中有把兩個變數抽出來:upstreamURL 是 Github 網址、phishURL 是我們釣魚網站的網址,要取代 HTML 網址時就直接用這兩個變數把 upstreamURL 取代成 phishURL,這樣使用者就不會被倒回真正的 Github

const (
    upstreamURL = "https://github.com"
    phishURL    = "http://localhost:8080"
)

但現在有個問題,因為上線後網址會變成 https://phish-github.com,不再是原本的 localhost,所以必須把 phishURL 改成上線後的網址,這邊我想到兩個解決方法:

  • 直接改

    直接把扣改成 const phishURL = "https://phish-github.com",這種方法叫做 hard code,是最不用動腦的方法,改完就可以部署上去了,但這樣有個副作用就是開發時你就要再改回 http://localhost:8080,一直改來改去

  • 從 command line 把參數讀進來

    第二個方法是從 command line 設定參數讓使用者把 phishURL 傳進來,用起來像 go run main.go --phishURL=https://phish-github.com,同一份扣可以開發也可以部署不用再改來改去,可配置程度高很多

實作

這邊選用第二種方法,在 Go 裡面要讀取 command line 參數可以使用 flag,他是官方提供用來處理參數的 package

var phishURL string

func main() {
    // 把 --phishURL=... 的值存進變數 phishURL 裡面
    // 預設值是 "http://localhost:8080"
    // "部署在哪個網域" 是這個參數的說明,自己看得懂就可以了
    flag.StringVar(&phishURL, "phishURL", "http://localhost:8080", "部署在哪個網域")
    flag.Parse()

    db.Connect()

    // ...
}

這樣就完成了用 command line 指定部署網址,因為預設值就是 http://localhost:8080,所以開發時還是跑 go run main.go 就可以,部署的時候再跑 go run main.go --phishURL=https://phish-github.com,如果哪天要換網域也不用改程式碼

port

監聽的 port 其實也有這個問題,之前為了開發都是監聽在 8080 port

func main() {
    http.HandleFunc("/phish-admin", adminHandler)
    http.HandleFunc("/", handler)
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        panic(err)
    }
}

但實際部署的時候應該要在預設的 HTTP port 80,這邊也是用一樣的解法,把 port 從 command line 讀進來,預設值設為開發時的 8080

var port string

func main() {
    // ...

    // 把 --port=... 的值存進變數 port 裡面
    // 預設值是 ":8080"
    flag.StringVar(&port, "port", ":8080", "部署在哪個 port")
    flag.Parse()

    err := http.ListenAndServe(port, nil)
}

部署的時候就直接 go run main.go --port=:80 --phishURL=https://phish-github.com,很方便吧~

使用說明

還記得剛剛用 flag 取值時都有加文字敘述嗎,編譯時 Go 會用他來生成使用說明,而且連預設值都有寫,真的很貼心 XD,以後我要寫 command line tool 大概都用 Go 寫了

小結

今天用 flagphishURLport 兩個變數改成可以配置的,這樣在開發跟部署時就可以用同一份扣,只要執行的時候加個參數就可以了。今天是最後一天寫扣了,Larry850806/go-phishing 這個 repo 是最後的完成品,覺得有趣的話不妨幫我按個星星,要開 issue 或是送 PR 也都很歡迎歐~

明天開始就是講部署的東西了,實作部分有任何問題都歡迎提出來~謝謝大家


上一篇
Day23-收網 III(簡單瀏覽介面)
下一篇
Day25-部署 I
系列文
Go Phishing!30 天用 Go 實作 Reverse Proxy 之釣魚大作戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
兩津勘吉
iT邦新手 4 級 ‧ 2018-11-08 10:11:53

很棒的系列文,學習了怎麼刻釣魚網站了XD用Python來學一個試試看

XD謝謝支持,懂原理之後任何語言應該都做得出來,只是我這邊是用 Go

我要留言

立即登入留言